package net.coffeedriven.alfred.plugin; import net.coffeedriven.alfred.spi.AbstractWorkflowPlugin; import net.coffeedriven.alfred.spi.AlfredWorkflowPlugin; import net.coffeedriven.alfred.spi.ItemManager; import org.reflections.Reflections; import org.reflections.util.ConfigurationBuilder; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.List; public class PluginManager { private final List<Class<? extends AlfredWorkflowPlugin>> workflowPluginClasses = new ArrayList<Class<? extends AlfredWorkflowPlugin>>(); private final List<AlfredWorkflowPlugin> workflowPlugins = new ArrayList<AlfredWorkflowPlugin>(); private ItemManager itemManager; public PluginManager(ItemManager itemManager) { if (itemManager == null) { throw new IllegalArgumentException("itemManager must not be null."); } this.itemManager = itemManager; } public void addPluginSource(File file) throws InvalidPluginException { try { URL url = file.toURI().toURL(); URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url}); Reflections reflections = new Reflections(ConfigurationBuilder.build(urlClassLoader, url)); workflowPluginClasses.addAll(reflections.getSubTypesOf(AlfredWorkflowPlugin.class)); workflowPluginClasses.addAll(reflections.getSubTypesOf(AbstractWorkflowPlugin.class)); } catch (MalformedURLException e) { throw new InvalidPluginException(String.format("Invalid plugin: %s.", file.getPath()), e); } } public void initializePlugins() throws PluginInstantiationException { for (Class<? extends AlfredWorkflowPlugin> workflowPluginClass : workflowPluginClasses) { try { AlfredWorkflowPlugin alfredWorkflowPlugin = workflowPluginClass.newInstance(); alfredWorkflowPlugin.setItemManager(itemManager); workflowPlugins.add(alfredWorkflowPlugin); } catch (Exception e) { throw new PluginInstantiationException( String.format("Could not instantiate plugin: %s.", workflowPluginClass.getName()), e); } } } public void invokePlugins(String query) throws PluginExecutionException { for (AlfredWorkflowPlugin workflowPlugin : workflowPlugins) { try { workflowPlugin.run(query); } catch (Exception e) { throw new PluginExecutionException( String.format("Could not execute plugin: %s", workflowPlugin.getClass().getName()), e); } } } }